Cloud DNSの限定公開のプライベートゾーンをTerraformで作成する
概要
Cloud DNSではGoogle Cloud内部でのみ名前解決できるプライベートゾーンを作成することができます。
以前上記ブログで扱った時は解説も兼ねてGUIで操作して限定公開のプライベートゾーンを作成しました。
最近Terraformを扱うことが多くなってきたので、備忘録も兼ねて限定公開のプライベートゾーンをTerraformで作成する過程を記事にしてみました。
やってみる
今回Terraformで作成するリソースは以下となります。
- 限定公開のプライベートゾーン
- 限定公開のプライベートゾーンを適用するVPC
- 限定公開のプライベートゾーンのAレコード
それでは作っていきます。
リファレンス
使用するTerraformのリソースとそのリソースのリファレンスを示します。
Resources | 概要 | リファレンス |
---|---|---|
google_dns_managed_zone | ゾーンの作成用 | google_dns_manage_zone |
google_compute_network | VPC作成用 | google_compute_network |
google_dns_record_set | Aレコード設定用 | google_dns_record_set |
とりあえずリファレンスを読み込んでTerraformスクリプトを実装してみます。
Terraformスクリプト
何はともあれ実装したTerraformスクリプトを示します。その後解説していきます。
provider "google" {
project = "Google CloudプロジェクトID"
region = "asia-northeast1" # 必要に応じて変更
}
# 限定公開ゾーンの作成
resource "google_dns_managed_zone" "private_zone" {
name = "example-private-zone"
dns_name = "example.local."
description = "Private DNS Zone"
visibility = "private" # 限定公開ゾーンを設定
private_visibility_config {
networks {
network_url = google_compute_network.network-1.id
}
}
}
resource "google_compute_network" "network-1" {
name = "network-1"
auto_create_subnetworks = false
}
# Aレコードの作成
resource "google_dns_record_set" "a_record" {
name = "app.example.local." # レコード名
type = "A" # レコードタイプ(Aレコード)
ttl = 300 # TTL(秒)
managed_zone = google_dns_managed_zone.private_zone.name
rrdatas = [
"***.***.***.***", # 指定するIPv4アドレス
]
}
順番に解説します。
限定公開ゾーンの作成
resource "google_dns_managed_zone" "private_zone" {
name = "example-private-zone"
dns_name = "example.local."
description = "Private DNS Zone"
visibility = "private"
private_visibility_config {
networks {
network_url = google_compute_network.network-1.id
}
}
}
-
resource "google_dns_managed_zone"
:- Cloud DNSのマネージドゾーンを作成するためのリソース
-
name
:- ゾーンの名前を指定
-
dns_name
:- ゾーンのDNS名(ドメイン名)を指定
-
description
:- ゾーンの説明を記載
-
visibility
:- ゾーンの公開範囲
"private"
を指定することで、限定公開のプライベートゾーンとなる。指定したVPC内でのみ名前解決が可能
-
private_visibility_config
:- 限定公開ゾーンを特定のVPCネットワークに関連付ける
networks
:- このゾーンに関連付けるVPCネットワークを指定
- 今回の例では、後述の
google_compute_network.network-1
で作成されるVPCのIDを指定
VPCの作成
resource "google_compute_network" "network-1" {
name = "network-1"
auto_create_subnetworks = false
}
-
resource "google_compute_network"
:- VPCを作成するリソース
-
name
:- VPC名を指定
-
auto_create_subnetworks
:- サブネットの自動作成を有効または無効にするオプション
false
を指定するとデフォルトのサブネットが自動的に作成されない
Aレコードの作成
resource "google_dns_record_set" "a_record" {
name = "app.example.local." # レコード名
type = "A" # レコードタイプ(Aレコード)
ttl = 300 # TTL(秒)
managed_zone = google_dns_managed_zone.private_zone.name
rrdatas = [
"***.***.***.***", # 指定するIPv4アドレス
]
}
-
resource "google_dns_record_set"
:- DNSレコードを作成するためのリソース
-
name
:- 作成するDNSレコードの名前を指定
-
type
:- レコードの種類を指定。Aレコードを作成したいので
A
を指定
- レコードの種類を指定。Aレコードを作成したいので
-
ttl
:- レコードの有効期限(Time To Live)を秒単位で指定。今回は
300
秒(5分)を指定
- レコードの有効期限(Time To Live)を秒単位で指定。今回は
-
managed_zone
:- DNSレコードを作成する対象のDNSゾーンを指定
-
rrdatas
:- このAレコードが指すIPアドレスを指定
- (
***.***.***.***
は必要に応じて書き換える)
実行するとどうなるか
実行結果としては以下となります。
-
VPCの作成:
network-1
という名前のVPCが作成されます
-
限定公開のプライベートゾーンの作成:
example.local.
という名前の限定公開のプライベートゾーンが作成されます- このゾーンは、指定したVPC(
network-1
)に関連付けているので、このVPC内でのみ名前解決が可能です
-
Aレコードの作成:
app.example.local.
という名前のAレコードが作成されます- 指定したIPv4アドレス(
***.***.***.***
)が設定されています
確認する
terraform apply
をしたらリソースが作成されているのでコンソールから確認してみます。
まずは限定公開のプライベートゾーン
種類がプライベート
なので限定公開のプライベートゾーンとして作成されていることが確認できます。Aレコードにも指定したIPアドレスが指定されていました(マスクしています)
続いてVPCも確認します。
指定した名称でVPCが作成されており、サブネット作成モードがカスタムサブネット
になっておりました。
上記より、Terraformで作成したかった通りのリソースが作成できていることが確認できました。
Terraformはサクッとできて本当に心強いですね。万歳。
所感
google_dns_managed_zoneとgoogle_compute_networkのように、リソース間の依存関係を明示的に指定しなくても、Terraformが自動的に解決してくれる点は非常に便利だなと思います。
また、再現性の高さも嬉しいです。Terraformコードを使えば、同じ設定を別の環境やプロジェクトでも簡単に再現できることは手作業でのミスを防ぎ、インフラの構成を確実に再現できるなと考えます。
それではまた、ナマステー